@file:JvmName("DateUtilsKt")

package com.benjaminwan.read.free.utils

import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*

/**
 * 获得默认的 date pattern
 */
var defaultDatePattern = "yyyy-MM-dd HH:mm:ss"

/**
 * 获得默认的 TimeZone
 */
var TIMEZONE = "Asia/Shanghai"

/**
 * 根据预设格式返回当前日期

 * @return
 */
val now: String
    get() = Date().format()

/**
 * 根据用户格式返回当前日期

 * @param format
 * *
 * @return
 */
fun getNow(format: String): String {
    return Date().format(format)
}


val defTimeZone: TimeZone
    get() = TimeZone.getTimeZone(TIMEZONE)

/**
 * 把Date以参数[pattern]格式化成字符串
 * @param  pattern
 * @return 返回格式化后的字符串
 */
fun Date.format(
    pattern: String = defaultDatePattern,
    timeZone: TimeZone = TimeZone.getDefault()
): String {
    val formatter = SimpleDateFormat(pattern, Locale.getDefault())
    formatter.timeZone = timeZone
    return formatter.format(this)
}

/**
 * 把Date以"yyyy-MM-dd HH:mm:ss.SSS"格式化成字符串
 * @return 返回格式化后的字符串
 */
fun Date.yyyyMMddHHmmssSSS(): String {
    return this.format("yyyy-MM-dd HH:mm:ss.SSS")
}

/**
 * 把Date以"HH:mm:ss.SSS"格式化成字符串
 * @return 返回格式化后的字符串
 */
fun Date.HHmmssSSS(): String {
    return this.format("HH:mm:ss.SSS")
}

/**
 * 把Date以"yyyy-MM-dd HH:mm:ss"格式化成字符串
 * @return 返回格式化后的字符串
 */
fun Date.yyyyMMddHHmmss(): String {
    return this.format("yyyy-MM-dd HH:mm:ss")
}

/**
 * 把Date以"yyyy-MM-dd"格式化成字符串
 * @return 返回格式化后的字符串
 */
fun Date.yyyyMMdd(): String {
    return this.format("yyyy-MM-dd")
}

/**
 * 把Date以"HH:mm:ss"格式化成字符串
 * @return 返回格式化后的字符串
 */
fun Date.HHmmss(): String {
    return this.format("HH:mm:ss")
}

/**
 * 把String以参数[pattern]格式化成Date，格式化失败时返回默认值[defVal]
 * @param  pattern
 * @param  defVal
 * @return 返回Date
 */
fun String.parseDateOrDef(
    pattern: String = defaultDatePattern,
    defVal: Date = Date(),
    timeZone: TimeZone = TimeZone.getDefault()
): Date {
    if (this.isEmpty()) return defVal
    val formatter = SimpleDateFormat(pattern, Locale.getDefault())
    formatter.timeZone = timeZone
    return try {
        formatter.parse(this)
    } catch (e: ParseException) {
        e.printStackTrace()
        defVal
    }
}

/**
 * 把String以参数[pattern]格式化成Date，格式化失败时返回null
 * @param  pattern
 * @return 返回Date
 */
fun String.parseDate(
    pattern: String = defaultDatePattern,
    timeZone: TimeZone = TimeZone.getDefault()
): Date? {
    if (this.isEmpty()) return null
    val formatter = SimpleDateFormat(pattern, Locale.getDefault())
    formatter.timeZone = timeZone
    return try {
        formatter.parse(this)
    } catch (e: ParseException) {
        e.printStackTrace()
        null
    }
}

/**
 * 把String以参数[inPattern]格式化输入，并以[outputStream]格式化输出
 * @param  inPattern 输入格式
 * @param  outPattern 输出格式
 * @return 返回String
 */
fun String.dateFormatConvert(
    inPattern: String = "yyyy-MM-dd HH:mm:ss",
    outPattern: String = "yyyy-MM-dd HH:mm:ss"
): String {
    return this.parseDateOrDef(inPattern).format(outPattern)
}

/**
 * 把String以"yyyy-MM-dd HH:mm:ss"格式化输入，并以"yyyyMM"格式化输出
 * @return 返回String
 */
fun String.yyyyMMddHHmmssToyyyyMM(): String {
    return this.dateFormatConvert("yyyy-MM-dd HH:mm:ss", "yyyyMM")
}

/**
 * 把String以"yyyy-MM-dd HH:mm:ss"格式化输入，并以"yyyy-MM-dd"格式化输出
 * @return 返回String
 */
fun String.yyyyMMddHHmmssToyyyyMMdd(): String {
    return this.dateFormatConvert("yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd")
}

/**
 * 把String以"yyyy-MM-dd"格式化输入，并以"yyyy年MM月dd日"格式化输出
 * @return 返回String
 */
fun String.yyyyMMddToNyr(): String {
    return this.dateFormatConvert("yyyy-MM-dd", "yyyy年MM月dd日")
}

/**
 * 把String以"yyyy-MM-dd HH:mm:ss"格式化输入，并以"yyyy年MM月dd日 HH时mm分"格式化输出
 * @return 返回String
 */
fun String.yyyyMMddHHmmssToNyrsf(): String {
    return this.dateFormatConvert("yyyy-MM-dd HH:mm:ss", "yyyy年MM月dd日 HH时mm分")
}

